import time
import cv2
import voice # 导入交互语音
import threading
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_holistic = mp.solutions.holistic

class myThread (threading.Thread):
    def __init__(self, path):
        threading.Thread.__init__(self)
        self.path = path
        self.voice1 = voice.Voice(self.path)
    def run(self):
        print ("开始线程：" + self.name)
        t3 = time.time()

        self.voice1.audioPlay()  # 调用声音播放
        print("线程调用：",time.time() - t3)
        print ("退出线程：" + self.name)

# 画图函数
def draws(image, post_landmarks, indexX, indexY, flag):
    # cv2.circle(image,
    #            (int(results.pose_landmarks.landmark[index].x * image.shape[1]),
    #             int(results.pose_landmarks.landmark[index].y * image.shape[0])),
    #            30, (255, 255, 255), 4)
    pointX = (int(results.pose_landmarks.landmark[indexX].x * image.shape[1]),
                int(results.pose_landmarks.landmark[indexX].y * image.shape[0]))
    pointY = (int(results.pose_landmarks.landmark[indexY].x * image.shape[1]),
                int(results.pose_landmarks.landmark[indexY].y * image.shape[0]))
    if flag == 1: # 正常模式
        cv2.line(image,pointX, pointY, (255, 255, 0), 4)
    elif flag == 2: # 警告模式
        cv2.line(image, pointX, pointY, (0, 0, 255), 4)

# For static images:
IMAGE_FILES = []
with mp_holistic.Holistic(
    static_image_mode=True,
    model_complexity=2) as holistic:
  for idx, file in enumerate(IMAGE_FILES):
    image = cv2.imread(file)
    image_height, image_width, _ = image.shape
    # Convert the BGR image to RGB before processing.
    results = holistic.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

    if results.pose_landmarks:
      print(
          f'Nose coordinates: ('
          f'{results.pose_landmarks.landmark[mp_holistic.PoseLandmark.NOSE].x * image_width}, '
          f'{results.pose_landmarks.landmark[mp_holistic.PoseLandmark.NOSE].y * image_height})'
      )
    # Draw pose, left and right hands, and face landmarks on the image.
    annotated_image = image.copy()
    mp_drawing.draw_landmarks(
        annotated_image,
        results.face_landmarks,
        mp_holistic.FACEMESH_TESSELATION,
        landmark_drawing_spec=None,
        connection_drawing_spec=mp_drawing_styles
        .get_default_face_mesh_tesselation_style())
    mp_drawing.draw_landmarks(
        annotated_image,
        results.pose_landmarks,
        mp_holistic.POSE_CONNECTIONS,
        landmark_drawing_spec=mp_drawing_styles.
        get_default_pose_landmarks_style())
    cv2.imwrite('/tmp/annotated_image' + str(idx) + '.png', annotated_image)
    # Plot pose world landmarks.
    mp_drawing.plot_landmarks(
        results.pose_world_landmarks, mp_holistic.POSE_CONNECTIONS)

fps = 0.0
model = 'Norming' # 默认为正常模式
changeflag = 1 # 初始化
music = voice.Voice() # 音乐初始化(只需初始化一次)

cv2.namedWindow("MediaPipe Holistic",flags=cv2.WINDOW_NORMAL)
# For webcam input:
cap = cv2.VideoCapture(0)
with mp_holistic.Holistic(
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as holistic:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      # If loading a video, use 'break' instead of 'continue'.
      continue
    t1 = time.time()
    # Flip the image horizontally for a later selfie-view display, and convert
    # the BGR image to RGB.
    image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
    # To improve performance, optionally mark the image as not writeable to
    # pass by reference.
    image.flags.writeable = False
    results = holistic.process(image)

    # Draw landmark annotation on the image.
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    mp_drawing.draw_landmarks(
        image,
        results.face_landmarks,
        mp_holistic.FACEMESH_CONTOURS,
        landmark_drawing_spec=None,
        connection_drawing_spec=mp_drawing_styles
        .get_default_face_mesh_contours_style())
    mp_drawing.draw_landmarks(
        image,
        results.pose_landmarks,
        mp_holistic.POSE_CONNECTIONS,
        landmark_drawing_spec=mp_drawing_styles
        .get_default_pose_landmarks_style())

    try:  # 未检测到会抛出输出异常,保证程序继续运行
        draws(image, results, 7, 0, changeflag)
        draws(image, results, 0, 8, changeflag)
        draws(image, results, 8, 10, changeflag)
        draws(image, results, 10, 9, changeflag)
        draws(image, results, 9, 7, changeflag)
        # draws(image, results, 4, 5)
        # draws(image, results, 4)
        # image = juget(image, results)
    except Exception as e:
        # print(e)
        pass
    fps = (fps + (1. / (time.time() - t1))) / 2
    image = cv2.putText(image, 'FPS:' + str(int(fps)), (int(image.shape[1] * 0.1), int(image.shape[0] * 0.2)),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.imshow('MediaPipe Holistic', image)


    # print("fps= %.2f" % (fps))
    if cv2.waitKey(5) & 0xFF == ord('q'):
        if changeflag == 1:
            model = 'Norming' # 切换模式为巡逻模式
            musicPath = "warning"
            music.audioPlay(musicPath)  # 交互语音触发
            del music # BUG:防止意外
            music = voice.Voice()  # BUG:音乐再次初始化
            changeflag = 2
        elif changeflag == 2:
            model = 'Warning' # 切换模式为警告模式

            changeflag = 1
cap.release()
